package la.iok.hzsvn.lewin.movie.cloud.service;

import la.iok.hzsvn.lewin.movie.cloud.entity.UserRole;
import la.iok.hzsvn.lewin.movie.core.RoleEnum;
import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.model.UserRoleDetail;
import la.iok.hzsvn.lewin.movie.core.model.UserRoleVo;
import la.iok.hzsvn.lewin.movie.core.model.UserVo;
import la.iok.hzsvn.lewin.mybatis.model.PageVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.NullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.Collection;
import java.util.List;

public interface UserRoleService extends BaseService<UserRole,Long> {
    /**
     * 保存用户角色
     * @param entity 用户角色角色
     * @return 保存的记录id
     */
    Long save(@NotNull UserRole entity);

    /**
     * 查找记录
     * @param userId 用户id
     * @param roleId 角色id
     * @param orgUnitId 组织id
     * @return 记录
     */
    @Nullable
    UserRole select(@Nullable Long userId,@Nullable Long roleId,@Nullable Long orgUnitId);
    /**
     * po转vo对象
     * @param userRoles po集合
     * @return vo集合
     */
    @NotNull
    @NotNullElement
    List<UserRoleVo> po2vo(@Nullable Collection<UserRole> userRoles);

    /**
     * 用户的所有组织关系
     * @param userId 用户id
     * @return 用户组织关系列表
     */
    @NotNull
    @NotNullElement
    List<UserRole> userRoles(@Nullable Long userId);

    /**
     * 用户在组织中是否有任意一种角色
     * @param userId 用户id
     * @param orgUnitId 组织id
     * @param roles 角色列表
     * @return 有其中任意一种角色返回true,否则false
     */
    boolean hasAnyAuthority(@Nullable Long userId, Long orgUnitId, RoleEnum... roles);

    /**
     * 用户在组织中是否只有一种指定的权限。如果啥权限也没有,也返回false
     * @param userId 用户id
     * @param orgUnitId 组织id
     * @param role 验证的权限
     * @return 有且只有一种指定的权限返回true,否则都false
     */
    boolean hasOnlyAuthority(@Nullable Long userId, Long orgUnitId, RoleEnum role);

    /**
     * 查询多个用户的所有角色
     * @param userIds 用户id列表
     * @return 指定所有用户的角色列表
     */
    @NotNull
    @NotNullElement
    List<UserRole> userRoles(@Nullable @NullElement Collection<Long> userIds);

    /**
     * 获取记录详细信息
     * @param userRoles 记录列表
     * @return 详细信息列表
     */
    @NotNull
    @NotNullElement
    List<UserRoleDetail> details(@Nullable Collection<UserRole> userRoles);

    /**
     * 获取用户的详细组织关系
     * @param userId 用户id
     * @return 用户的组织关系列表
     */
    List<UserRoleDetail> details(Long userId);


    PageVo<UserVo> selectOrgUnitroles(Token token, Long orgUnitId, Long roleId);


    int userCount(@Nullable @NotNullElement Collection<Long> orgUnitIds);

    List<UserRole>selectRoles(Long orgUnitId ,Long roleId);

    int increaseScore(Long userId,Long orgUnitId,Long score);

    int reduceScore(Long userId,Long orgUnitId,Long score);

    List<UserRole>selectScore(Long userId,Long orgUnitId);

}
